package com.smy.baseutil.net;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * FTP 上传工具类
 * @author zhoutao
 *
 */
public class FTPUtil {
	
	private static Logger logger = LoggerFactory.getLogger(FTPUtil.class);

         
        private static FTPClient ftp;   
        
        private static String encoding = System.getProperty("file.encoding");
        /** 
         *    
         * @param addr 地址 
         * @param port 端口号 
         * @param username 用户名 
         * @param password 密码 
         * @return 
         * @throws Exception 
         */  
        public  boolean connect(String addr,int port,String username,String password) throws Exception {    
            boolean result = false;    
            ftp = new FTPClient();    
            int reply;    
            ftp.connect(addr,port);    
            ftp.login(username,password);    
            ftp.setFileType(FTPClient.BINARY_FILE_TYPE);    
            reply = ftp.getReplyCode();    
            if (!FTPReply.isPositiveCompletion(reply)) {    
                ftp.disconnect();    
                logger.error("FTP服务器 拒绝连接");
                return result;    
            }
            logger.info("FTP连接建立成功");
            ftp.enterLocalPassiveMode();
            result = true;    
            return result;    
        } 
        
        /** 
         *  
         * @param remotePath 上传到ftp服务器哪个路径下  
         * @param uploadFileName 上传文件名 （单文件时候生效，为空或者null时候取要上传文件的名字）
         * @param file 上传的文件或文件夹 
         * @throws Exception 
         */  
        public void uploadFile(String remotePath, String uploadFileName, String fileName) throws Exception{   
        	File file = new File(fileName);
            ftp.changeWorkingDirectory(remotePath);   
        	logger.info("上传路径为：{}", remotePath);  
            ftp.setControlEncoding(encoding);
            if(file.isDirectory()){         
                ftp.makeDirectory(file.getName());              
                ftp.changeWorkingDirectory(file.getName());    
                String[] files = file.list();           
                for (int i = 0; i < files.length; i++) {    
                    File file1 = new File(file.getPath() + File.separator + files[i] );    
                    if(file1.isDirectory()){    
                        uploadFile(remotePath, null, file1.getAbsolutePath());    
                        ftp.changeToParentDirectory();    
                    }else{                  
                        File file2 = new File(file.getPath() + File.separator + files[i]);    
                        FileInputStream input = new FileInputStream(file2);    
                        ftp.storeFile(file2.getName(), input);    
                        input.close();                          
                    }               
                }    
            }else{    
                File file2 = new File(file.getAbsolutePath());    
                FileInputStream input = new FileInputStream(file2);   
                if(!"".equals(uploadFileName) && null != uploadFileName){
                	logger.info("上传文件名为：{}", uploadFileName);  
                    ftp.storeFile(uploadFileName, input);
                }else{
                    ftp.storeFile(file2.getName(), input);
                }    
                input.close();      
            } 
            logger.info("文件或文件夹上传成功");   
        }  
        /**
         * 从FTP服务器下载文件
         * @param remotePath FTP服务器上的相对路径
         * @param fileName 要下载的文件名
         * @param savePath 下载后保存到本地的路径
         * @throws Exception 
         */
        public void downFile(String remotePath, String fileName, String savePath) throws Exception{
            ftp.changeWorkingDirectory(remotePath);   
            ftp.setControlEncoding(encoding);
            File parentDir = new File(savePath);
			if (!parentDir.exists()) {
				// 如果所在目录不存在,则新建.
				parentDir.mkdirs();
                logger.info("新增保存目录，路径 {}", parentDir.getAbsolutePath());
			}
            //获得ftp服务器指定目录下所有文件
            FTPFile[] listFiles = ftp.listFiles();
            for(int i = 0; i < listFiles.length ; i++){
            	FTPFile tTPFile = listFiles[i];
            	//判断文件名与要下载的文件名相同
            	if((tTPFile.getName()).equals(fileName) ||( "*".equals(fileName) && !(tTPFile.getName()).equals(".") && !(tTPFile.getName()).equals(".."))){
            		//文件保存路径
            		String saveFilePath = savePath  + tTPFile.getName();
            		File localFile = new File(saveFilePath);
               	 	logger.info(localFile.getAbsolutePath());
    				localFile.createNewFile();
                    OutputStream is = new FileOutputStream(localFile);
                    ftp.retrieveFile(tTPFile.getName(), is);
                    logger.info("FTP文件下载成功，路径 {}", saveFilePath);
                    is.close();
            	}
            }
        }
        
        /**
         * 关闭FTP连接
         */
        public void disconnect(){
    	   try { 
    		   ftp.logout();
    		   ftp.disconnect(); 
    		   logger.info("FTP连接关闭成功");
           } catch (IOException e) { 
               e.printStackTrace(); 
               throw new RuntimeException("关闭FTP连接发生异常！", e); 
           } 
       }
        
    
}
